package com.chuxing.system.controller;

import cn.dev33.satoken.stp.StpUtil;
import com.chuxing.config.PermissionsState;
import com.chuxing.config.SecurityRole;
import com.chuxing.domain.DTO.GetTimeListDTO;
import com.chuxing.domain.Result;
import com.chuxing.domain.Time;
import com.chuxing.domain.VO.PageResultVO;
import com.chuxing.exception.GenericException;
import com.chuxing.exception.UnauthorizedException;
import com.chuxing.system.service.ITimeService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

/**
 * 考试及面试时间Controller
 *
 * @author 刘祺
 * @date 2024-11-30
 */
@RestController
@RequestMapping("/system/time")
@RequiredArgsConstructor
@Tag(name = "考试及面试时间服务", description = "考试及面试时间服务相关接口")
public class TimeController
{
    private static final Logger log = LoggerFactory.getLogger(TimeController.class);
    private final ITimeService timeService;

    /**
     * 查询考试及面试时间列表
     * 该方法用于处理查询考试和面试时间的请求
     * 它接收一个 GetTimeListDTO 对象作为参数，该对象包含了查询条件
     * 返回一个 Result 对象，其中包含了一个 PageResultVO 对象，该对象包含了查询结果
     */
    @Operation(summary = "查询考试及面试时间列表", description = "查询考试及面试时间列表")
    @PostMapping("/getTimeList")
    public Result<PageResultVO> getTimeList(@RequestBody GetTimeListDTO getTimeListDTO)
    {
        // 记录查询条件的日志信息
        log.info("查询考试及面试时间列表{}", getTimeListDTO);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 调用 timeService 的 selectTimeList 方法进行查询，并将结果存储在 pageResultVO 中
        PageResultVO pageResultVO = timeService.selectTimeList(getTimeListDTO);
        // 返回一个成功的 Result 对象，包含成功消息和查询结果
        return Result.success("获取时间列表成功", pageResultVO);
    }

//    /**
//     * 导出考试及面试时间列表
//     */
//    @PostMapping("/export")
//    public void export(HttpServletResponse response, Time time)
//    {
//        List<Time> list = timeService.selectTimeList(time);
//        ExcelUtil<Time> util = new ExcelUtil<Time>(Time.class);
//        util.exportExcel(response, list, "考试及面试时间数据");
//    }
//
    /**
     * 获取考试及面试时间详细信息
     */
    @Operation(summary = "管理员获取考试及面试时间详细信息", description = "管理员根据考试及面试时间ID获取详细信息")
    @GetMapping(value = "/{id}")
    public Result<Time> getInfo(@PathVariable("id") Long id)
    {
        log.info("获取考试及面试时间详细信息，参数为：{}", id);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        if(!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)){
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        Time time = timeService.selectTimeById(id);
        return Result.success("获取考试及面试时间信息成功", time);
    }

    /**
     * 新增考试及面试时间
     */
    @Operation(summary = "管理员新增考试及面试时间", description = "管理员新增考试及面试时间")
    @PostMapping("addTime")
    public Result<Object> add(@RequestBody Time time)
    {
        // 记录新增考试及面试时间的日志
        log.info("新增考试及面试时间{}", time);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 检查用户是否具有管理员角色
        if (!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)) {
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        // 调用服务层方法插入考试或面试时间
        timeService.insertTime(time);
        // 返回新增成功的结果
        return Result.success( "新增考试及面试时间成功");
    }

    /**
     * 修改考试及面试时间
     * 该方法通过PUT请求接收一个Time对象，用于更新系统中的考试或面试时间
     * 它首先验证请求体中的时间信息是否合法，然后调用TimeService的updateTime方法来更新时间
     * 如果更新成功，返回一个表示操作成功的Result对象
     *
     * @param time 包含要更新的考试或面试时间信息的Time对象
     * @return 返回一个Result对象，表示修改操作的结果
     */
    @PutMapping
    @Operation(summary = "管理员修改考试及面试时间", description = "管理员修改考试及面试时间")
    public Result<Object> edit(@RequestBody Time time)
    {
        log.info("管理员修改考试及面试时间{}", time);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 检查用户是否具有管理员角色
        if (!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)) {
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        // 调用服务层方法更新时间信息
        timeService.updateTime(time);
        // 返回修改成功的结果
        return Result.success( "修改考试及面试时间成功");
    }

    /**
     * 删除考试及面试时间
     */
    @DeleteMapping("/{ids}")
    @Operation(summary = "管理员删除考试及面试时间", description = "管理员根据考试及面试时间ID删除考试及面试时间")
    public Result<Object> remove(@PathVariable Long[] ids)
    {
        // 记录删除操作的日志信息
        log.info("删除考试及面试时间{}", ids);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 检查用户是否具有管理员角色
        if (!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)) {
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        // 调用服务层方法，根据ID数组删除考试及面试时间
        timeService.deleteTimeByIds(ids);
        // 返回删除成功的结果信息
        return Result.success( "删除考试及面试时间成功");
    }
}
